注册流转任务管理服务成功后,无法推荐设备或选择设备列表接口未返回任何设备
现象描述
注册流转任务管理服务成功后,无对应的推荐设备。调用选择设备列表接口,未返回任何设备。
可能原因
设备过滤条件不对,将设备过滤掉了。
解决办法
检查设备过滤条件,具体过滤条件参数说明,可以参考开发指导接口说明中ExtraParams说明。
在选择设备列表选择设备,并调用更新设备连接状态的接口后,列表中设备连接状态没有刷新
现象描述
在选择设备列表选择设备,并调用更新设备连接状态的接口后,列表中设备连接状态没有刷新。
可能原因
没有在UI主线程中调用更新设备连接状态的接口,导致界面内容不刷新。
解决办法
检查是否在UI主线程中调用更新设备连接状态接口。
设备不支持流转任务管理服务时如何实现多端协同
这种情况下实现多端协同时,需要在Intent中指定对端设备的deviceId。开发者可通过设备管理类DeviceManager提供的getTrustedDeviceList接口,获取指定条件下匿名化处理的设备列表。getTrustedDeviceList可参考ohos.distributedhardware.devicemanager.DeviceManager的API描述。
之后,开发者需要自行实现流转任务管理,即设备选择、流转状态管理等。
操作步骤如下。
在对应的config.json文件中,声明获取设备列表及设备信息的权限。
{
“reqPermissions”: [
{
“name”: “ohos.permission.DISTRIBUTED_DATASYNC”,
“reason”: “need”,
“usedScene”: {
“ability”: [
“MainAbility”
],
“when”: “inuse”
}
},
{
“name”: “com.huawei.permission.ACCESS_SERVICE_DM”,
“reason”: “need”,
“usedScene”: {
“ability”: [
“MainAbility”
],
“when”: “inuse”
}
}
]
}
通过getTrustedDeviceList接口获取设备列表,用于指定目标设备。
// 设备列表按最近使用排序
int MOST_RECENTLY_USED = 0;
// 获取设备管理类
ohos.distributedhardware.devicemanager.DeviceManager devManager;
// ISelectResult是一个自定义接口,用来处理指定设备deviceId后执行的行为
interface ISelectResult {
void onSelectResult(String deviceId);
}
public void onStart(Intent intent) {
….
// 调用DeviceManager的getTrustedDeviceList接口获取在线设备列表
ohos.distributedhardware.devicemanager.DeviceManager.createInstance(new ohos.distributedhardware.devicemanager.DeviceManager.DeviceManagerCallback() {
public void onGet(ohos.distributedhardware.devicemanager.DeviceManager deviceManager) {
devManager = deviceManager;
}
public void onDied() {
HiLog.info(LABEL_LOG, “DeviceManager onDied call.”);
}
});
}
// 获取设备列表,开发者可在获取的在线设备列表中选择目标设备执行操作
private void scheduleRemoteAbility(ISelectResult listener) {
Map<String, Object> filter = new HashMap<>();
filter.put(ohos.distributedhardware.devicemanager.DeviceManager.TARGET_PACKAGE_NAME, BUNDLE_NAME);
filter.put(ohos.distributedhardware.devicemanager.DeviceManager.SORT_TYPE, MOST_RECENTLY_USED);
if (devManager ==null) {
HiLog.info(LABEL_LOG, “scheduleRemoteAbility devManager is null”);
return;
}
List<DeviceInfo> onlineDevices = devManager.getTrustedDeviceList(BUNDLE_NAME, filter);
// 判断组网设备是否为空
if (onlineDevices.isEmpty()) {
listener.onSelectResult(null);
return;
}
int numDevices = onlineDevices.size();
List<String> deviceIds = new ArrayList<>(numDevices);
onlineDevices.forEach((device) -> {
deviceIds.add(device.getNetworkId());
});
// 以选择首个设备作为目标设备为例
// 开发者也可按照具体场景,通过其它方式进行设备选择
String selectedDeviceId = deviceIds.get(0);
listener.onSelectResult(selectedDeviceId);
}
通过点击事件实现连接,利用连接关系控制PA以及断开连接等行为。
// 连接远程PA
private ClickedListener mConnectRemotePAListener = new ClickedListener() {
public void onClick(Component arg0) {
scheduleRemoteAbility(new ISelectResult() {
void onSelectResult(String deviceId) {
if (deviceId != null) {
Intent connectPAIntent = new Intent();
// bundleName和abilityName与待连接的PA一一对应
// 例如:bundleName = “com.helloworld”
// abilityName = “com.helloworld.SampleParticleAbility”
Operation operation = new Intent.OperationBuilder()
.withDeviceId(deviceId)
.withBundleName(bundleName)
.withAbilityName(abilityName)
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
connectPAIntent.setOperation(operation);
connectAbility(connectPAIntent, mConn);
}
}
});
}
};